package br.com.ac.fatureweb.rest.service;

import java.util.ArrayList;
import java.util.List;

import javax.inject.Inject;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;

import br.com.ac.fatureweb.exception.AccessNaoAutorizadoException;
import br.com.ac.fatureweb.exception.NgcException;
import br.com.ac.fatureweb.integration.billing.FotografiaVO;
import br.com.ac.fatureweb.integration.model.CloseRouteVo;
import br.com.ac.fatureweb.service.NgcLeituristaBean;
import br.com.ac.fatureweb.service.NgcRoteiroBean;
import br.com.ac.fatureweb.service.ValidarAcesso;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

@Path("/closeRouteBean")
public class CloseRouteBean {

	@Inject
	private NgcLeituristaBean ngcLeituristaBean;

	@Inject
	private NgcRoteiroBean ngcRoteiroBean;

	@GET
	@Path("ping")
	@Produces(MediaType.APPLICATION_JSON)
	public Response ping() {
		try {
			return Response.ok().entity(true).build();
		} catch (final Exception e) {
			return Response.status(Status.INTERNAL_SERVER_ERROR)
					.entity(e.getMessage()).build();
		}
	}

	@POST
	@Path("validateReturnRoute")
	@Produces(MediaType.APPLICATION_JSON)
	public Response validateReturnRoute(

	@FormParam("imei") final String imei,

	@FormParam("usuario") final Long usuario,

	@FormParam("senha") final String senha,

	@FormParam("idRoteiro") final Long idRoteiro,

	@FormParam("lstRetorno") final String lstRetorno) {
		try {
			if (ValidarAcesso.execute(usuario, senha, imei, ngcLeituristaBean)) {

				if (lstRetorno != null && !lstRetorno.isEmpty()) {

					List<Long> lstConsulta = new ArrayList<Long>();

					Gson gson = new Gson();

					List<CloseRouteVo> lstEntrada = gson.fromJson(lstRetorno,
							new TypeToken<ArrayList<CloseRouteVo>>() {
							}.getType());

					for (CloseRouteVo closeRouteVo : lstEntrada) {
						lstConsulta.add(closeRouteVo.getCodigo());
					}

					List<Long> lstPendentes = ngcRoteiroBean
							.validateReturnRoute(lstConsulta);

					if (lstPendentes != null && !lstPendentes.isEmpty()) {

						return Response.ok().entity(lstPendentes).build();
					}
				}
			}

			return Response.status(Status.NO_CONTENT).build();

		} catch (AccessNaoAutorizadoException anae) {
			return Response.status(Status.UNAUTHORIZED)
					.entity(anae.getMessage()).build();
		} catch (final Exception e) {
			return Response.status(Status.INTERNAL_SERVER_ERROR)
					.entity(e.getMessage()).build();
		}
	}

	@POST
	@Path("validateLogCorrectionRoute")
	@Produces(MediaType.APPLICATION_JSON)
	public Response validateLogCorrectionRoute(

	@FormParam("imei") final String imei,

	@FormParam("usuario") final Long usuario,

	@FormParam("senha") final String senha,

	@FormParam("idRoteiro") final Long idRoteiro,

	@FormParam("lstRetorno") final String lstRetorno) {
		try {
			if (ValidarAcesso.execute(usuario, senha, imei, ngcLeituristaBean)) {

				if (lstRetorno != null && !lstRetorno.isEmpty()) {

					List<Long> lstConsulta = new ArrayList<Long>();

					Gson gson = new Gson();

					List<CloseRouteVo> lstEntrada = gson.fromJson(lstRetorno,
							new TypeToken<ArrayList<CloseRouteVo>>() {
							}.getType());

					for (CloseRouteVo closeRouteVo : lstEntrada) {
						lstConsulta.add(closeRouteVo.getCodigo());
					}
					List<Long> lstPendentes = ngcRoteiroBean
							.validateLogCorrectionRoute(lstConsulta);

					if (lstPendentes != null && !lstPendentes.isEmpty()) {

						return Response.ok().entity(lstPendentes).build();
					}
				}
			}

			return Response.status(Status.NO_CONTENT).build();
		} catch (AccessNaoAutorizadoException anae) {
			return Response.status(Status.UNAUTHORIZED)
					.entity(anae.getMessage()).build();
		} catch (final Exception e) {
			return Response.status(Status.INTERNAL_SERVER_ERROR)
					.entity(e.getMessage()).build();
		}
	}

	@POST
	@Path("receivePhotos")
	@Produces(MediaType.APPLICATION_JSON)
	public Response receivePhotos(

	@FormParam("imei") final String imei,

	@FormParam("usuario") final Long usuario,

	@FormParam("senha") final String senha,

	@FormParam("idRoteiro") final Long idRoteiro,

	@FormParam("lstRetornoFotografia") final String lstRetornoFotografia) {
		try {
			if (ValidarAcesso.execute(usuario, senha, imei, ngcLeituristaBean)) {

				List<FotografiaVO> lstFotografias = new Gson().fromJson(
						lstRetornoFotografia,
						new TypeToken<ArrayList<FotografiaVO>>() {
						}.getType());

				ngcRoteiroBean.receivePhotos(idRoteiro, lstFotografias);

				return Response.ok().build();
			}

			return Response.status(Status.NO_CONTENT).build();
		} catch (AccessNaoAutorizadoException anae) {
			return Response.status(Status.UNAUTHORIZED)
					.entity(anae.getMessage()).build();
		} catch (final Exception e) {
			return Response.status(Status.INTERNAL_SERVER_ERROR)
					.entity(e.getMessage()).build();
		}
	}

	@POST
	@Path("marcarRoteiro")
	@Produces(MediaType.APPLICATION_JSON)
	public Response marcarRoteiro(

	@FormParam("imei") final String imei,

	@FormParam("usuario") final Long usuario,

	@FormParam("senha") final String senha,

	@FormParam("idRoteiro") final Long idRoteiro) {
		try {
			if (ValidarAcesso.execute(usuario, senha, imei, ngcLeituristaBean)) {

				ngcRoteiroBean.marcarRoteiroRetornado(idRoteiro);

				return Response.ok().entity(true).build();
			}

			return Response.status(Status.NO_CONTENT).build();
		} catch (AccessNaoAutorizadoException anae) {
			return Response.status(Status.UNAUTHORIZED)
					.entity(anae.getMessage()).build();
		} catch (NgcException e) {
			return Response.status(Status.INTERNAL_SERVER_ERROR)
					.entity(e.getMessage()).build();
		} catch (final Exception e) {
			return Response.status(Status.INTERNAL_SERVER_ERROR)
					.entity(e.getMessage()).build();
		}
	}

}